@qjp88995/provider-client 0.2.0 → 0.4.0

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
Files changed (145) hide show
  1. package/dist/direct-resolver.d.ts.map +1 -1
  2. package/dist/direct-resolver.js +2 -0
  3. package/dist/direct-resolver.js.map +1 -1
  4. package/dist/image/http.d.ts +16 -0
  5. package/dist/image/http.d.ts.map +1 -0
  6. package/dist/image/http.js +62 -0
  7. package/dist/image/http.js.map +1 -0
  8. package/dist/image/index.d.ts +32 -0
  9. package/dist/image/index.d.ts.map +1 -0
  10. package/dist/image/index.js +39 -0
  11. package/dist/image/index.js.map +1 -0
  12. package/dist/image/types.d.ts +94 -0
  13. package/dist/image/types.d.ts.map +1 -0
  14. package/dist/image/types.js +44 -0
  15. package/dist/image/types.js.map +1 -0
  16. package/dist/image/volcengine.adapter.d.ts +8 -0
  17. package/dist/image/volcengine.adapter.d.ts.map +1 -0
  18. package/dist/image/volcengine.adapter.js +85 -0
  19. package/dist/image/volcengine.adapter.js.map +1 -0
  20. package/dist/index.d.ts +6 -2
  21. package/dist/index.d.ts.map +1 -1
  22. package/dist/index.js +5 -1
  23. package/dist/index.js.map +1 -1
  24. package/dist/justone/client.d.ts +101 -0
  25. package/dist/justone/client.d.ts.map +1 -0
  26. package/dist/justone/client.js +272 -0
  27. package/dist/justone/client.js.map +1 -0
  28. package/dist/justone/endpoint-spec.d.ts +49 -0
  29. package/dist/justone/endpoint-spec.d.ts.map +1 -0
  30. package/dist/justone/endpoint-spec.js +2 -0
  31. package/dist/justone/endpoint-spec.js.map +1 -0
  32. package/dist/justone/endpoints.generated.d.ts +7927 -0
  33. package/dist/justone/endpoints.generated.d.ts.map +1 -0
  34. package/dist/justone/endpoints.generated.js +8508 -0
  35. package/dist/justone/endpoints.generated.js.map +1 -0
  36. package/dist/justone/errors.d.ts +52 -0
  37. package/dist/justone/errors.d.ts.map +1 -0
  38. package/dist/justone/errors.js +73 -0
  39. package/dist/justone/errors.js.map +1 -0
  40. package/dist/justone/index.d.ts +8 -0
  41. package/dist/justone/index.d.ts.map +1 -0
  42. package/dist/justone/index.js +7 -0
  43. package/dist/justone/index.js.map +1 -0
  44. package/dist/justone/params.d.ts +17 -0
  45. package/dist/justone/params.d.ts.map +1 -0
  46. package/dist/justone/params.js +72 -0
  47. package/dist/justone/params.js.map +1 -0
  48. package/dist/justone/pricing.d.ts +6 -0
  49. package/dist/justone/pricing.d.ts.map +1 -0
  50. package/dist/justone/pricing.generated.d.ts +303 -0
  51. package/dist/justone/pricing.generated.d.ts.map +1 -0
  52. package/dist/justone/pricing.generated.js +305 -0
  53. package/dist/justone/pricing.generated.js.map +1 -0
  54. package/dist/justone/pricing.js +11 -0
  55. package/dist/justone/pricing.js.map +1 -0
  56. package/dist/media/bibigpt.adapter.d.ts +43 -0
  57. package/dist/media/bibigpt.adapter.d.ts.map +1 -0
  58. package/dist/media/bibigpt.adapter.js +302 -0
  59. package/dist/media/bibigpt.adapter.js.map +1 -0
  60. package/dist/media/http.d.ts +21 -0
  61. package/dist/media/http.d.ts.map +1 -0
  62. package/dist/media/http.js +39 -0
  63. package/dist/media/http.js.map +1 -0
  64. package/dist/media/index.d.ts +44 -0
  65. package/dist/media/index.d.ts.map +1 -0
  66. package/dist/media/index.js +47 -0
  67. package/dist/media/index.js.map +1 -0
  68. package/dist/media/types.d.ts +207 -0
  69. package/dist/media/types.d.ts.map +1 -0
  70. package/dist/media/types.js +21 -0
  71. package/dist/media/types.js.map +1 -0
  72. package/dist/media/zhipu-parser-package.d.ts +37 -0
  73. package/dist/media/zhipu-parser-package.d.ts.map +1 -0
  74. package/dist/media/zhipu-parser-package.js +108 -0
  75. package/dist/media/zhipu-parser-package.js.map +1 -0
  76. package/dist/media/zhipu.adapter.d.ts +37 -0
  77. package/dist/media/zhipu.adapter.d.ts.map +1 -0
  78. package/dist/media/zhipu.adapter.js +361 -0
  79. package/dist/media/zhipu.adapter.js.map +1 -0
  80. package/dist/provider-client.d.ts +62 -0
  81. package/dist/provider-client.d.ts.map +1 -1
  82. package/dist/provider-client.js +176 -0
  83. package/dist/provider-client.js.map +1 -1
  84. package/dist/types.d.ts +23 -2
  85. package/dist/types.d.ts.map +1 -1
  86. package/dist/types.js +12 -2
  87. package/dist/types.js.map +1 -1
  88. package/dist/web-search/deepseek.adapter.d.ts +19 -0
  89. package/dist/web-search/deepseek.adapter.d.ts.map +1 -0
  90. package/dist/web-search/deepseek.adapter.js +82 -0
  91. package/dist/web-search/deepseek.adapter.js.map +1 -0
  92. package/dist/web-search/http.d.ts +28 -0
  93. package/dist/web-search/http.d.ts.map +1 -0
  94. package/dist/web-search/http.js +95 -0
  95. package/dist/web-search/http.js.map +1 -0
  96. package/dist/web-search/index.d.ts +27 -0
  97. package/dist/web-search/index.d.ts.map +1 -0
  98. package/dist/web-search/index.js +36 -0
  99. package/dist/web-search/index.js.map +1 -0
  100. package/dist/web-search/minimax.adapter.d.ts +13 -0
  101. package/dist/web-search/minimax.adapter.d.ts.map +1 -0
  102. package/dist/web-search/minimax.adapter.js +82 -0
  103. package/dist/web-search/minimax.adapter.js.map +1 -0
  104. package/dist/web-search/moonshotai.adapter.d.ts +19 -0
  105. package/dist/web-search/moonshotai.adapter.d.ts.map +1 -0
  106. package/dist/web-search/moonshotai.adapter.js +151 -0
  107. package/dist/web-search/moonshotai.adapter.js.map +1 -0
  108. package/dist/web-search/types.d.ts +120 -0
  109. package/dist/web-search/types.d.ts.map +1 -0
  110. package/dist/web-search/types.js +60 -0
  111. package/dist/web-search/types.js.map +1 -0
  112. package/dist/web-search/zhipu.adapter.d.ts +14 -0
  113. package/dist/web-search/zhipu.adapter.d.ts.map +1 -0
  114. package/dist/web-search/zhipu.adapter.js +98 -0
  115. package/dist/web-search/zhipu.adapter.js.map +1 -0
  116. package/package.json +4 -3
  117. package/src/direct-resolver.ts +2 -0
  118. package/src/image/http.ts +68 -0
  119. package/src/image/index.ts +87 -0
  120. package/src/image/types.ts +134 -0
  121. package/src/image/volcengine.adapter.ts +133 -0
  122. package/src/index.ts +126 -0
  123. package/src/justone/client.ts +462 -0
  124. package/src/justone/endpoint-spec.ts +66 -0
  125. package/src/justone/endpoints.generated.ts +9258 -0
  126. package/src/justone/errors.ts +97 -0
  127. package/src/justone/index.ts +34 -0
  128. package/src/justone/params.ts +91 -0
  129. package/src/justone/pricing.generated.ts +308 -0
  130. package/src/justone/pricing.ts +11 -0
  131. package/src/media/bibigpt.adapter.ts +372 -0
  132. package/src/media/http.ts +43 -0
  133. package/src/media/index.ts +114 -0
  134. package/src/media/types.ts +233 -0
  135. package/src/media/zhipu-parser-package.ts +149 -0
  136. package/src/media/zhipu.adapter.ts +510 -0
  137. package/src/provider-client.ts +303 -1
  138. package/src/types.ts +31 -2
  139. package/src/web-search/deepseek.adapter.ts +149 -0
  140. package/src/web-search/http.ts +108 -0
  141. package/src/web-search/index.ts +70 -0
  142. package/src/web-search/minimax.adapter.ts +148 -0
  143. package/src/web-search/moonshotai.adapter.ts +228 -0
  144. package/src/web-search/types.ts +172 -0
  145. package/src/web-search/zhipu.adapter.ts +184 -0
@@ -1 +1 @@
1
- {"version":3,"file":"direct-resolver.d.ts","sourceRoot":"","sources":["../src/direct-resolver.ts"],"names":[],"mappings":"AAAA,OAAO,EAGL,KAAK,WAAW,EAChB,KAAK,QAAQ,EACb,KAAK,aAAa,EAClB,KAAK,cAAc,EACpB,MAAM,mBAAmB,CAAC;AAC3B,OAAO,KAAK,EACV,eAAe,EACf,YAAY,EAEZ,aAAa,EACb,UAAU,EACX,MAAM,YAAY,CAAC;AACpB,OAAO,KAAK,EAAE,WAAW,EAAE,MAAM,oBAAoB,CAAC;AAEtD,mCAAmC;AACnC,MAAM,WAAW,YAAY;IAC3B,IAAI,EAAE,MAAM,CAAC;IACb,qBAAqB;IACrB,IAAI,CAAC,EAAE,MAAM,CAAC;IACd,IAAI,EAAE,UAAU,CAAC;IACjB,mBAAmB;IACnB,MAAM,EAAE,MAAM,CAAC;IACf,SAAS,EAAE,eAAe,EAAE,CAAC;IAC7B,wDAAwD;IACxD,MAAM,EAAE,WAAW,EAAE,CAAC;IACtB,iCAAiC;IACjC,KAAK,CAAC,EAAE,WAAW,CAAC;CACrB;AAED,MAAM,MAAM,WAAW,GAAG,IAAI,CAAC,YAAY,EAAE,SAAS,GAAG,WAAW,CAAC,GACnE,OAAO,CAAC,IAAI,CAAC,YAAY,EAAE,SAAS,GAAG,WAAW,CAAC,CAAC,CAAC;AAEvD;;;GAGG;AACH,qBAAa,mBAAoB,YAAW,aAAa;IACvD,OAAO,CAAC,QAAQ,CAAC,OAAO,CAGnB;gBAEO,OAAO,EAAE,SAAS,YAAY,EAAE;IAuBtC,OAAO,CACX,GAAG,EAAE,QAAQ,EACb,OAAO,GAAE,cAAmB,GAC3B,OAAO,CAAC,WAAW,CAAC;IAcvB,cAAc,CAAC,GAAG,EAAE,QAAQ,GAAG,OAAO,CAAC,aAAa,EAAE,CAAC;CAMxD"}
1
+ {"version":3,"file":"direct-resolver.d.ts","sourceRoot":"","sources":["../src/direct-resolver.ts"],"names":[],"mappings":"AAAA,OAAO,EAGL,KAAK,WAAW,EAChB,KAAK,QAAQ,EACb,KAAK,aAAa,EAClB,KAAK,cAAc,EACpB,MAAM,mBAAmB,CAAC;AAC3B,OAAO,KAAK,EACV,eAAe,EACf,YAAY,EAEZ,aAAa,EACb,UAAU,EACX,MAAM,YAAY,CAAC;AACpB,OAAO,KAAK,EAAE,WAAW,EAAE,MAAM,oBAAoB,CAAC;AAEtD,mCAAmC;AACnC,MAAM,WAAW,YAAY;IAC3B,IAAI,EAAE,MAAM,CAAC;IACb,qBAAqB;IACrB,IAAI,CAAC,EAAE,MAAM,CAAC;IACd,IAAI,EAAE,UAAU,CAAC;IACjB,mBAAmB;IACnB,MAAM,EAAE,MAAM,CAAC;IACf,SAAS,EAAE,eAAe,EAAE,CAAC;IAC7B,wDAAwD;IACxD,MAAM,EAAE,WAAW,EAAE,CAAC;IACtB,iCAAiC;IACjC,KAAK,CAAC,EAAE,WAAW,CAAC;CACrB;AAED,MAAM,MAAM,WAAW,GAAG,IAAI,CAAC,YAAY,EAAE,SAAS,GAAG,WAAW,CAAC,GACnE,OAAO,CAAC,IAAI,CAAC,YAAY,EAAE,SAAS,GAAG,WAAW,CAAC,CAAC,CAAC;AAEvD;;;GAGG;AACH,qBAAa,mBAAoB,YAAW,aAAa;IACvD,OAAO,CAAC,QAAQ,CAAC,OAAO,CAGnB;gBAEO,OAAO,EAAE,SAAS,YAAY,EAAE;IAyBtC,OAAO,CACX,GAAG,EAAE,QAAQ,EACb,OAAO,GAAE,cAAmB,GAC3B,OAAO,CAAC,WAAW,CAAC;IAcvB,cAAc,CAAC,GAAG,EAAE,QAAQ,GAAG,OAAO,CAAC,aAAa,EAAE,CAAC;CAMxD"}
@@ -23,6 +23,8 @@ export class DirectModelResolver {
23
23
  pricing: null,
24
24
  ...m,
25
25
  })),
26
+ // 直连不做生图(生图只走中心)。
27
+ imageModels: [],
26
28
  }));
27
29
  }
28
30
  // async:找不到厂商 / 模型时以 rejected promise 报出,与中心模式一致。
@@ -1 +1 @@
1
- {"version":3,"file":"direct-resolver.js","sourceRoot":"","sources":["../src/direct-resolver.ts"],"names":[],"mappings":"AAAA,OAAO,EACL,WAAW,EACX,SAAS,GAKV,MAAM,mBAAmB,CAAC;AA4B3B;;;GAGG;AACH,MAAM,OAAO,mBAAmB;IACb,OAAO,CAGnB;IAEL,YAAY,OAAgC;QAC1C,IAAI,CAAC,OAAO,GAAG,OAAO,CAAC,GAAG,CAAC,CAAC,CAAC,EAAE,CAAC,CAAC;YAC/B,IAAI,EAAE,CAAC,CAAC,IAAI;YACZ,IAAI,EAAE,CAAC,CAAC,IAAI,IAAI,CAAC,CAAC,IAAI;YACtB,IAAI,EAAE,CAAC,CAAC,IAAI;YACZ,6CAA6C;YAC7C,QAAQ,EAAE,KAAK;YACf,MAAM,EAAE,CAAC,CAAC,MAAM;YAChB,KAAK,EAAE,CAAC,CAAC,KAAK;YACd,SAAS,EAAE,CAAC,CAAC,SAAS;YACtB,MAAM,EAAE,CAAC,CAAC,MAAM,CAAC,GAAG,CAAC,CAAC,CAAC,EAAE,CAAC,CAAC;gBACzB,WAAW,EAAE,CAAC,CAAC,OAAO;gBACtB,YAAY,EAAE,EAAE;gBAChB,gBAAgB,EAAE,IAAI;gBACtB,eAAe,EAAE,IAAI;gBACrB,OAAO,EAAE,IAAI;gBACb,GAAG,CAAC;aACL,CAAC,CAAC;SACJ,CAAC,CAAC,CAAC;IACN,CAAC;IAED,kDAAkD;IAElD,KAAK,CAAC,OAAO,CACX,GAAa,EACb,UAA0B,EAAE;QAE5B,SAAS,CAAC,IAAI,CAAC,OAAO,EAAE,GAAG,CAAC,CAAC;QAC7B,MAAM,MAAM,GAAG,IAAI,CAAC,OAAO,CAAC,IAAI,CAAC,CAAC,CAAC,EAAE,CAAC,CAAC,CAAC,IAAI,KAAK,GAAG,CAAC,MAAM,CAAE,CAAC;QAC9D,MAAM,KAAK,GAAG,MAAM,CAAC,MAAM,CAAC,IAAI,CAAC,CAAC,CAAC,EAAE,CAAC,CAAC,CAAC,OAAO,KAAK,GAAG,CAAC,OAAO,CAAE,CAAC;QAClE,OAAO,WAAW,CAAC;YACjB,GAAG;YACH,MAAM;YACN,KAAK;YACL,MAAM,EAAE,MAAM,CAAC,MAAM;YACrB,QAAQ,EAAE,GAAG,EAAE,CAAC,MAAM,CAAC,KAAK;YAC5B,eAAe,EAAE,OAAO,CAAC,eAAe;SACzC,CAAC,CAAC;IACL,CAAC;IAED,cAAc,CAAC,GAAa;QAC1B,MAAM,KAAK,GAAG,IAAI,CAAC,OAAO;aACvB,IAAI,CAAC,CAAC,CAAC,EAAE,CAAC,CAAC,CAAC,IAAI,KAAK,GAAG,CAAC,MAAM,CAAC;YACjC,EAAE,MAAM,CAAC,IAAI,CAAC,CAAC,CAAC,EAAE,CAAC,CAAC,CAAC,OAAO,KAAK,GAAG,CAAC,OAAO,CAAC,CAAC;QAChD,OAAO,OAAO,CAAC,OAAO,CAAC,KAAK,CAAC,CAAC,CAAC,CAAC,GAAG,KAAK,CAAC,YAAY,CAAC,CAAC,CAAC,CAAC,EAAE,CAAC,CAAC;IAC/D,CAAC;CACF"}
1
+ {"version":3,"file":"direct-resolver.js","sourceRoot":"","sources":["../src/direct-resolver.ts"],"names":[],"mappings":"AAAA,OAAO,EACL,WAAW,EACX,SAAS,GAKV,MAAM,mBAAmB,CAAC;AA4B3B;;;GAGG;AACH,MAAM,OAAO,mBAAmB;IACb,OAAO,CAGnB;IAEL,YAAY,OAAgC;QAC1C,IAAI,CAAC,OAAO,GAAG,OAAO,CAAC,GAAG,CAAC,CAAC,CAAC,EAAE,CAAC,CAAC;YAC/B,IAAI,EAAE,CAAC,CAAC,IAAI;YACZ,IAAI,EAAE,CAAC,CAAC,IAAI,IAAI,CAAC,CAAC,IAAI;YACtB,IAAI,EAAE,CAAC,CAAC,IAAI;YACZ,6CAA6C;YAC7C,QAAQ,EAAE,KAAK;YACf,MAAM,EAAE,CAAC,CAAC,MAAM;YAChB,KAAK,EAAE,CAAC,CAAC,KAAK;YACd,SAAS,EAAE,CAAC,CAAC,SAAS;YACtB,MAAM,EAAE,CAAC,CAAC,MAAM,CAAC,GAAG,CAAC,CAAC,CAAC,EAAE,CAAC,CAAC;gBACzB,WAAW,EAAE,CAAC,CAAC,OAAO;gBACtB,YAAY,EAAE,EAAE;gBAChB,gBAAgB,EAAE,IAAI;gBACtB,eAAe,EAAE,IAAI;gBACrB,OAAO,EAAE,IAAI;gBACb,GAAG,CAAC;aACL,CAAC,CAAC;YACH,kBAAkB;YAClB,WAAW,EAAE,EAAE;SAChB,CAAC,CAAC,CAAC;IACN,CAAC;IAED,kDAAkD;IAElD,KAAK,CAAC,OAAO,CACX,GAAa,EACb,UAA0B,EAAE;QAE5B,SAAS,CAAC,IAAI,CAAC,OAAO,EAAE,GAAG,CAAC,CAAC;QAC7B,MAAM,MAAM,GAAG,IAAI,CAAC,OAAO,CAAC,IAAI,CAAC,CAAC,CAAC,EAAE,CAAC,CAAC,CAAC,IAAI,KAAK,GAAG,CAAC,MAAM,CAAE,CAAC;QAC9D,MAAM,KAAK,GAAG,MAAM,CAAC,MAAM,CAAC,IAAI,CAAC,CAAC,CAAC,EAAE,CAAC,CAAC,CAAC,OAAO,KAAK,GAAG,CAAC,OAAO,CAAE,CAAC;QAClE,OAAO,WAAW,CAAC;YACjB,GAAG;YACH,MAAM;YACN,KAAK;YACL,MAAM,EAAE,MAAM,CAAC,MAAM;YACrB,QAAQ,EAAE,GAAG,EAAE,CAAC,MAAM,CAAC,KAAK;YAC5B,eAAe,EAAE,OAAO,CAAC,eAAe;SACzC,CAAC,CAAC;IACL,CAAC;IAED,cAAc,CAAC,GAAa;QAC1B,MAAM,KAAK,GAAG,IAAI,CAAC,OAAO;aACvB,IAAI,CAAC,CAAC,CAAC,EAAE,CAAC,CAAC,CAAC,IAAI,KAAK,GAAG,CAAC,MAAM,CAAC;YACjC,EAAE,MAAM,CAAC,IAAI,CAAC,CAAC,CAAC,EAAE,CAAC,CAAC,CAAC,OAAO,KAAK,GAAG,CAAC,OAAO,CAAC,CAAC;QAChD,OAAO,OAAO,CAAC,OAAO,CAAC,KAAK,CAAC,CAAC,CAAC,CAAC,GAAG,KAAK,CAAC,YAAY,CAAC,CAAC,CAAC,CAAC,EAAE,CAAC,CAAC;IAC/D,CAAC;CACF"}
@@ -0,0 +1,16 @@
1
+ import { type ImageConnection } from './types.js';
2
+ /**
3
+ * POST 一段 JSON,返回状态码与响应正文(同 web-search 的 `postJson`)。只处理「请求没发出去」与「中心自己报的错」:
4
+ * 中止原样抛;网络错误、中心的 `upstream_error` 是可重试的上游错误;中心别的错(没有可用 key、不许用这家……)是配置问题,
5
+ * 抛 `ProviderClientError`。厂商的状态码与响应体怎么解释是适配器的事。
6
+ */
7
+ export declare function postJson(label: string, url: string, { apiKey, fetch }: ImageConnection, body: Record<string, unknown>, signal: AbortSignal): Promise<{
8
+ status: number;
9
+ ok: boolean;
10
+ text: string;
11
+ }>;
12
+ /** 错误详情别整段回灌(HTML 错误页可能几十 KB)。 */
13
+ export declare function clip(text: string): string;
14
+ /** 端点根 + 子路径(根上多余的 `/` 去掉)。 */
15
+ export declare function joinUrl(baseUrl: string, path: string): string;
16
+ //# sourceMappingURL=http.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"http.d.ts","sourceRoot":"","sources":["../../src/image/http.ts"],"names":[],"mappings":"AAEA,OAAO,EAAE,KAAK,eAAe,EAAsB,MAAM,YAAY,CAAC;AAEtE;;;;GAIG;AACH,wBAAsB,QAAQ,CAC5B,KAAK,EAAE,MAAM,EACb,GAAG,EAAE,MAAM,EACX,EAAE,MAAM,EAAE,KAAK,EAAE,EAAE,eAAe,EAClC,IAAI,EAAE,MAAM,CAAC,MAAM,EAAE,OAAO,CAAC,EAC7B,MAAM,EAAE,WAAW,GAClB,OAAO,CAAC;IAAE,MAAM,EAAE,MAAM,CAAC;IAAC,EAAE,EAAE,OAAO,CAAC;IAAC,IAAI,EAAE,MAAM,CAAA;CAAE,CAAC,CAiCxD;AAUD,kCAAkC;AAClC,wBAAgB,IAAI,CAAC,IAAI,EAAE,MAAM,GAAG,MAAM,CAGzC;AAED,+BAA+B;AAC/B,wBAAgB,OAAO,CAAC,OAAO,EAAE,MAAM,EAAE,IAAI,EAAE,MAAM,GAAG,MAAM,CAE7D"}
@@ -0,0 +1,62 @@
1
+ import { parseCenterError, ProviderClientError } from '../errors.js';
2
+ import { PC_HEADERS } from '../types.js';
3
+ import { ImageUpstreamError } from './types.js';
4
+ /**
5
+ * POST 一段 JSON,返回状态码与响应正文(同 web-search 的 `postJson`)。只处理「请求没发出去」与「中心自己报的错」:
6
+ * 中止原样抛;网络错误、中心的 `upstream_error` 是可重试的上游错误;中心别的错(没有可用 key、不许用这家……)是配置问题,
7
+ * 抛 `ProviderClientError`。厂商的状态码与响应体怎么解释是适配器的事。
8
+ */
9
+ export async function postJson(label, url, { apiKey, fetch }, body, signal) {
10
+ let res;
11
+ try {
12
+ res = await fetch(url, {
13
+ method: 'POST',
14
+ headers: {
15
+ ...(apiKey ? { authorization: `Bearer ${apiKey}` } : {}),
16
+ 'content-type': 'application/json',
17
+ },
18
+ body: JSON.stringify(body),
19
+ signal,
20
+ });
21
+ }
22
+ catch (err) {
23
+ if (signal.aborted)
24
+ throw err;
25
+ const reason = err instanceof Error ? err.message : String(err);
26
+ throw new ImageUpstreamError(`${label} 请求失败:${reason}`, {
27
+ retryable: true,
28
+ });
29
+ }
30
+ const text = await res.text();
31
+ if (!res.ok && !res.headers.has(PC_HEADERS.credential)) {
32
+ const center = centerErrorOf(text);
33
+ if (center?.code === 'upstream_error') {
34
+ throw new ImageUpstreamError(`${label} 请求失败:${center.message}`, {
35
+ code: center.code,
36
+ retryable: true,
37
+ });
38
+ }
39
+ if (center) {
40
+ throw new ProviderClientError(center.code, center.message, res.status);
41
+ }
42
+ }
43
+ return { status: res.status, ok: res.ok, text };
44
+ }
45
+ function centerErrorOf(text) {
46
+ try {
47
+ return parseCenterError(JSON.parse(text));
48
+ }
49
+ catch {
50
+ return null;
51
+ }
52
+ }
53
+ /** 错误详情别整段回灌(HTML 错误页可能几十 KB)。 */
54
+ export function clip(text) {
55
+ const flat = text.replace(/\s+/g, ' ').trim();
56
+ return flat.length > 300 ? `${flat.slice(0, 300)}…` : flat;
57
+ }
58
+ /** 端点根 + 子路径(根上多余的 `/` 去掉)。 */
59
+ export function joinUrl(baseUrl, path) {
60
+ return `${baseUrl.replace(/\/+$/, '')}/${path}`;
61
+ }
62
+ //# sourceMappingURL=http.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"http.js","sourceRoot":"","sources":["../../src/image/http.ts"],"names":[],"mappings":"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"}
@@ -0,0 +1,32 @@
1
+ import { type GenerateImageInput, type GenerateImageOutcome, type ImageConnection, type ImageTraits } from './types.js';
2
+ import { VolcengineImageAdapter } from './volcengine.adapter.js';
3
+ /** kind → 生图适配器。中心哪几家能录生图模型(`VendorKindInfo.imageGeneration`)与这里一一对应(契约测试钉着)。 */
4
+ export declare const IMAGE_ADAPTERS: {
5
+ readonly volcengine: VolcengineImageAdapter;
6
+ };
7
+ export type ImageKind = keyof typeof IMAGE_ADAPTERS;
8
+ export declare const IMAGE_KINDS: ImageKind[];
9
+ export declare function isImageKind(kind: string): kind is ImageKind;
10
+ /** 一个生图模型,连接已绑好。 */
11
+ export interface ImageGenerator {
12
+ readonly kind: ImageKind;
13
+ readonly modelId: string;
14
+ readonly traits: ImageTraits;
15
+ /** 能不能带参考图(目录里的 `reference-image` 能力)。 */
16
+ readonly referenceImages: boolean;
17
+ generate(input: GenerateImageInput, signal: AbortSignal): Promise<GenerateImageOutcome>;
18
+ }
19
+ export interface CreateImageGeneratorInput {
20
+ kind: ImageKind;
21
+ modelId: string;
22
+ /** 目录里这个模型有 `reference-image` 能力。 */
23
+ referenceImages: boolean;
24
+ connection: ImageConnection;
25
+ }
26
+ /**
27
+ * 绑好连接的生图模型。中心模式用 `ProviderClient.imageModel`;这里是直连(测试)与中心模式共用的底层。
28
+ * 生成前先校验(空提示词、参考图不支持 / 超张数)并把尺寸放进这家的限制(`fitImageSize`)。
29
+ */
30
+ export declare function createImageGenerator(input: CreateImageGeneratorInput): ImageGenerator;
31
+ export * from './types.js';
32
+ //# sourceMappingURL=index.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"index.d.ts","sourceRoot":"","sources":["../../src/image/index.ts"],"names":[],"mappings":"AAAA,OAAO,EAEL,KAAK,kBAAkB,EACvB,KAAK,oBAAoB,EAEzB,KAAK,eAAe,EACpB,KAAK,WAAW,EACjB,MAAM,YAAY,CAAC;AACpB,OAAO,EAAE,sBAAsB,EAAE,MAAM,yBAAyB,CAAC;AAEjE,iFAAiF;AACjF,eAAO,MAAM,cAAc;;CAEsB,CAAC;AAElD,MAAM,MAAM,SAAS,GAAG,MAAM,OAAO,cAAc,CAAC;AACpD,eAAO,MAAM,WAAW,EAAkC,SAAS,EAAE,CAAC;AAEtE,wBAAgB,WAAW,CAAC,IAAI,EAAE,MAAM,GAAG,IAAI,IAAI,SAAS,CAE3D;AAED,oBAAoB;AACpB,MAAM,WAAW,cAAc;IAC7B,QAAQ,CAAC,IAAI,EAAE,SAAS,CAAC;IACzB,QAAQ,CAAC,OAAO,EAAE,MAAM,CAAC;IACzB,QAAQ,CAAC,MAAM,EAAE,WAAW,CAAC;IAC7B,0CAA0C;IAC1C,QAAQ,CAAC,eAAe,EAAE,OAAO,CAAC;IAClC,QAAQ,CACN,KAAK,EAAE,kBAAkB,EACzB,MAAM,EAAE,WAAW,GAClB,OAAO,CAAC,oBAAoB,CAAC,CAAC;CAClC;AAED,MAAM,WAAW,yBAAyB;IACxC,IAAI,EAAE,SAAS,CAAC;IAChB,OAAO,EAAE,MAAM,CAAC;IAChB,qCAAqC;IACrC,eAAe,EAAE,OAAO,CAAC;IACzB,UAAU,EAAE,eAAe,CAAC;CAC7B;AAED;;;GAGG;AACH,wBAAgB,oBAAoB,CAClC,KAAK,EAAE,yBAAyB,GAC/B,cAAc,CAmChB;AAED,cAAc,YAAY,CAAC"}
@@ -0,0 +1,39 @@
1
+ import { fitImageSize, } from './types.js';
2
+ import { VolcengineImageAdapter } from './volcengine.adapter.js';
3
+ /** kind → 生图适配器。中心哪几家能录生图模型(`VendorKindInfo.imageGeneration`)与这里一一对应(契约测试钉着)。 */
4
+ export const IMAGE_ADAPTERS = {
5
+ volcengine: new VolcengineImageAdapter(),
6
+ };
7
+ export const IMAGE_KINDS = Object.keys(IMAGE_ADAPTERS);
8
+ export function isImageKind(kind) {
9
+ return Object.hasOwn(IMAGE_ADAPTERS, kind);
10
+ }
11
+ /**
12
+ * 绑好连接的生图模型。中心模式用 `ProviderClient.imageModel`;这里是直连(测试)与中心模式共用的底层。
13
+ * 生成前先校验(空提示词、参考图不支持 / 超张数)并把尺寸放进这家的限制(`fitImageSize`)。
14
+ */
15
+ export function createImageGenerator(input) {
16
+ const adapter = IMAGE_ADAPTERS[input.kind];
17
+ const traits = adapter.traits(input.modelId);
18
+ return {
19
+ kind: input.kind,
20
+ modelId: input.modelId,
21
+ traits,
22
+ referenceImages: input.referenceImages,
23
+ generate: (req, signal) => {
24
+ if (!req.prompt.trim()) {
25
+ return Promise.reject(new RangeError('prompt must not be empty'));
26
+ }
27
+ const refs = req.referenceImages ?? [];
28
+ if (refs.length > 0 && !input.referenceImages) {
29
+ return Promise.reject(new RangeError(`model "${input.modelId}" does not take reference images`));
30
+ }
31
+ if (refs.length > traits.maxReferenceImages) {
32
+ return Promise.reject(new RangeError(`at most ${traits.maxReferenceImages} reference images, got ${refs.length}`));
33
+ }
34
+ return adapter.generate(input.connection, input.modelId, { ...req, size: fitImageSize(req.size, traits) }, signal);
35
+ },
36
+ };
37
+ }
38
+ export * from './types.js';
39
+ //# sourceMappingURL=index.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"index.js","sourceRoot":"","sources":["../../src/image/index.ts"],"names":[],"mappings":"AAAA,OAAO,EACL,YAAY,GAMb,MAAM,YAAY,CAAC;AACpB,OAAO,EAAE,sBAAsB,EAAE,MAAM,yBAAyB,CAAC;AAEjE,iFAAiF;AACjF,MAAM,CAAC,MAAM,cAAc,GAAG;IAC5B,UAAU,EAAE,IAAI,sBAAsB,EAAE;CACO,CAAC;AAGlD,MAAM,CAAC,MAAM,WAAW,GAAG,MAAM,CAAC,IAAI,CAAC,cAAc,CAAgB,CAAC;AAEtE,MAAM,UAAU,WAAW,CAAC,IAAY;IACtC,OAAO,MAAM,CAAC,MAAM,CAAC,cAAc,EAAE,IAAI,CAAC,CAAC;AAC7C,CAAC;AAuBD;;;GAGG;AACH,MAAM,UAAU,oBAAoB,CAClC,KAAgC;IAEhC,MAAM,OAAO,GAAiB,cAAc,CAAC,KAAK,CAAC,IAAI,CAAC,CAAC;IACzD,MAAM,MAAM,GAAG,OAAO,CAAC,MAAM,CAAC,KAAK,CAAC,OAAO,CAAC,CAAC;IAC7C,OAAO;QACL,IAAI,EAAE,KAAK,CAAC,IAAI;QAChB,OAAO,EAAE,KAAK,CAAC,OAAO;QACtB,MAAM;QACN,eAAe,EAAE,KAAK,CAAC,eAAe;QACtC,QAAQ,EAAE,CAAC,GAAG,EAAE,MAAM,EAAE,EAAE;YACxB,IAAI,CAAC,GAAG,CAAC,MAAM,CAAC,IAAI,EAAE,EAAE,CAAC;gBACvB,OAAO,OAAO,CAAC,MAAM,CAAC,IAAI,UAAU,CAAC,0BAA0B,CAAC,CAAC,CAAC;YACpE,CAAC;YACD,MAAM,IAAI,GAAG,GAAG,CAAC,eAAe,IAAI,EAAE,CAAC;YACvC,IAAI,IAAI,CAAC,MAAM,GAAG,CAAC,IAAI,CAAC,KAAK,CAAC,eAAe,EAAE,CAAC;gBAC9C,OAAO,OAAO,CAAC,MAAM,CACnB,IAAI,UAAU,CACZ,UAAU,KAAK,CAAC,OAAO,kCAAkC,CAC1D,CACF,CAAC;YACJ,CAAC;YACD,IAAI,IAAI,CAAC,MAAM,GAAG,MAAM,CAAC,kBAAkB,EAAE,CAAC;gBAC5C,OAAO,OAAO,CAAC,MAAM,CACnB,IAAI,UAAU,CACZ,WAAW,MAAM,CAAC,kBAAkB,0BAA0B,IAAI,CAAC,MAAM,EAAE,CAC5E,CACF,CAAC;YACJ,CAAC;YACD,OAAO,OAAO,CAAC,QAAQ,CACrB,KAAK,CAAC,UAAU,EAChB,KAAK,CAAC,OAAO,EACb,EAAE,GAAG,GAAG,EAAE,IAAI,EAAE,YAAY,CAAC,GAAG,CAAC,IAAI,EAAE,MAAM,CAAC,EAAE,EAChD,MAAM,CACP,CAAC;QACJ,CAAC;KACF,CAAC;AACJ,CAAC;AAED,cAAc,YAAY,CAAC"}
@@ -0,0 +1,94 @@
1
+ import type { VendorFetch } from '../vendors/index.js';
2
+ /**
3
+ * 生图的厂商适配。适配器只管「这家的请求长什么样、响应怎么翻、哪些失败值得重试」与这家的尺寸限制;
4
+ * 什么时候生、生几张、提示词怎么写是 APP 的事。**一次调用出一张图**(火山 5.5 不支持一次多张):要几张就并发几次。
5
+ */
6
+ export interface ImageSize {
7
+ width: number;
8
+ height: number;
9
+ }
10
+ /** 参考图(图生图 / 改图)。字节随请求发出(data URI),不依赖公网地址。 */
11
+ export interface ReferenceImage {
12
+ data: Uint8Array;
13
+ /** `image/jpeg`、`image/png`、`image/webp` …… */
14
+ mimeType: string;
15
+ }
16
+ export declare const IMAGE_FORMATS: readonly ["jpeg", "png"];
17
+ export type ImageFormat = (typeof IMAGE_FORMATS)[number];
18
+ export interface GenerateImageInput {
19
+ prompt: string;
20
+ /**
21
+ * 想要的像素尺寸。这家的面积上下限之外会**等比**缩放进去(比例不变),实际尺寸看结果;
22
+ * 想先知道就用 `fitImageSize(size, traits)`。
23
+ */
24
+ size: ImageSize;
25
+ /** 参考图;模型没有 `reference-image` 能力或超过 `traits.maxReferenceImages` 张就报错,不悄悄丢。 */
26
+ referenceImages?: readonly ReferenceImage[];
27
+ /** 缺省 `jpeg`(幻灯片配图用 jpeg 小一个量级)。 */
28
+ format?: ImageFormat;
29
+ }
30
+ export interface GeneratedImage {
31
+ data: Uint8Array;
32
+ mimeType: string;
33
+ width: number;
34
+ height: number;
35
+ }
36
+ export interface ImageUsage {
37
+ generatedImages: number;
38
+ inputImages: number;
39
+ /** 厂商报的 token 数(火山按面积折算);不报为 null。计价按张,这个只做记录。 */
40
+ tokens: number | null;
41
+ }
42
+ export interface GenerateImageOutcome {
43
+ image: GeneratedImage;
44
+ usage: ImageUsage;
45
+ }
46
+ /** 这家(这个模型)生图的限制,给调用方定尺寸、写工具说明用。 */
47
+ export interface ImageTraits {
48
+ /** 面积下限(像素)。 */
49
+ minPixels: number;
50
+ /** 面积上限(像素)。 */
51
+ maxPixels: number;
52
+ /** 宽高比(长边 / 短边)上限。 */
53
+ maxAspectRatio: number;
54
+ /** 一次最多带几张参考图。 */
55
+ maxReferenceImages: number;
56
+ }
57
+ /**
58
+ * 调一次上游要的东西:这家生图所用端点的根地址与出站 fetch。中心模式下 fetch 是中心的透传 fetch、不带 key;
59
+ * 直连模式给 `apiKey`。
60
+ */
61
+ export interface ImageConnection {
62
+ baseUrl: string;
63
+ fetch: VendorFetch;
64
+ apiKey?: string;
65
+ }
66
+ export interface ImageAdapter<K extends string = string> {
67
+ readonly kind: K;
68
+ /** 生图请求发往这家哪个端点(取它的根地址)。 */
69
+ readonly endpointProtocol: 'openai-chat-completions';
70
+ traits(modelId: string): ImageTraits;
71
+ generate(conn: ImageConnection, modelId: string, input: GenerateImageInput, signal: AbortSignal): Promise<GenerateImageOutcome>;
72
+ }
73
+ /**
74
+ * 厂商的失败(HTTP 错误、拒绝生成、响应不成形、没拿到响应)。中心自己报的错是 `ProviderClientError`。
75
+ * 调用方只读 `retryable` 决定要不要再试,不解析消息文本。
76
+ */
77
+ export declare class ImageUpstreamError extends Error {
78
+ readonly name = "ImageUpstreamError";
79
+ /** 上游错误码(火山的 `InvalidParameter`、`OutputImageSensitiveContentDetected` ……),没有就是 null。 */
80
+ readonly code: string | null;
81
+ readonly retryable: boolean;
82
+ /** 被内容审核拦下(换提示词再试;原样重试没用)。 */
83
+ readonly contentFiltered: boolean;
84
+ constructor(reason: string, opts?: {
85
+ code?: string;
86
+ retryable?: boolean;
87
+ contentFiltered?: boolean;
88
+ });
89
+ }
90
+ /**
91
+ * 把想要的尺寸放进这家的限制:宽高比超了先按上限收窄短边;面积超了等比缩小、不够等比放大。取整后面积仍要在界内。
92
+ */
93
+ export declare function fitImageSize(size: ImageSize, traits: ImageTraits): ImageSize;
94
+ //# sourceMappingURL=types.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"types.d.ts","sourceRoot":"","sources":["../../src/image/types.ts"],"names":[],"mappings":"AAAA,OAAO,KAAK,EAAE,WAAW,EAAE,MAAM,qBAAqB,CAAC;AAEvD;;;GAGG;AAEH,MAAM,WAAW,SAAS;IACxB,KAAK,EAAE,MAAM,CAAC;IACd,MAAM,EAAE,MAAM,CAAC;CAChB;AAED,+CAA+C;AAC/C,MAAM,WAAW,cAAc;IAC7B,IAAI,EAAE,UAAU,CAAC;IACjB,+CAA+C;IAC/C,QAAQ,EAAE,MAAM,CAAC;CAClB;AAED,eAAO,MAAM,aAAa,0BAA2B,CAAC;AACtD,MAAM,MAAM,WAAW,GAAG,CAAC,OAAO,aAAa,CAAC,CAAC,MAAM,CAAC,CAAC;AAEzD,MAAM,WAAW,kBAAkB;IACjC,MAAM,EAAE,MAAM,CAAC;IACf;;;OAGG;IACH,IAAI,EAAE,SAAS,CAAC;IAChB,8EAA8E;IAC9E,eAAe,CAAC,EAAE,SAAS,cAAc,EAAE,CAAC;IAC5C,oCAAoC;IACpC,MAAM,CAAC,EAAE,WAAW,CAAC;CACtB;AAED,MAAM,WAAW,cAAc;IAC7B,IAAI,EAAE,UAAU,CAAC;IACjB,QAAQ,EAAE,MAAM,CAAC;IACjB,KAAK,EAAE,MAAM,CAAC;IACd,MAAM,EAAE,MAAM,CAAC;CAChB;AAED,MAAM,WAAW,UAAU;IACzB,eAAe,EAAE,MAAM,CAAC;IACxB,WAAW,EAAE,MAAM,CAAC;IACpB,kDAAkD;IAClD,MAAM,EAAE,MAAM,GAAG,IAAI,CAAC;CACvB;AAED,MAAM,WAAW,oBAAoB;IACnC,KAAK,EAAE,cAAc,CAAC;IACtB,KAAK,EAAE,UAAU,CAAC;CACnB;AAED,oCAAoC;AACpC,MAAM,WAAW,WAAW;IAC1B,gBAAgB;IAChB,SAAS,EAAE,MAAM,CAAC;IAClB,gBAAgB;IAChB,SAAS,EAAE,MAAM,CAAC;IAClB,sBAAsB;IACtB,cAAc,EAAE,MAAM,CAAC;IACvB,kBAAkB;IAClB,kBAAkB,EAAE,MAAM,CAAC;CAC5B;AAED;;;GAGG;AACH,MAAM,WAAW,eAAe;IAC9B,OAAO,EAAE,MAAM,CAAC;IAChB,KAAK,EAAE,WAAW,CAAC;IACnB,MAAM,CAAC,EAAE,MAAM,CAAC;CACjB;AAED,MAAM,WAAW,YAAY,CAAC,CAAC,SAAS,MAAM,GAAG,MAAM;IACrD,QAAQ,CAAC,IAAI,EAAE,CAAC,CAAC;IACjB,4BAA4B;IAC5B,QAAQ,CAAC,gBAAgB,EAAE,yBAAyB,CAAC;IACrD,MAAM,CAAC,OAAO,EAAE,MAAM,GAAG,WAAW,CAAC;IACrC,QAAQ,CACN,IAAI,EAAE,eAAe,EACrB,OAAO,EAAE,MAAM,EACf,KAAK,EAAE,kBAAkB,EACzB,MAAM,EAAE,WAAW,GAClB,OAAO,CAAC,oBAAoB,CAAC,CAAC;CAClC;AAED;;;GAGG;AACH,qBAAa,kBAAmB,SAAQ,KAAK;IAC3C,SAAkB,IAAI,wBAAwB;IAC9C,wFAAwF;IACxF,QAAQ,CAAC,IAAI,EAAE,MAAM,GAAG,IAAI,CAAC;IAC7B,QAAQ,CAAC,SAAS,EAAE,OAAO,CAAC;IAC5B,8BAA8B;IAC9B,QAAQ,CAAC,eAAe,EAAE,OAAO,CAAC;gBAGhC,MAAM,EAAE,MAAM,EACd,IAAI,GAAE;QAAE,IAAI,CAAC,EAAE,MAAM,CAAC;QAAC,SAAS,CAAC,EAAE,OAAO,CAAC;QAAC,eAAe,CAAC,EAAE,OAAO,CAAA;KAAO;CAO/E;AAED;;GAEG;AACH,wBAAgB,YAAY,CAAC,IAAI,EAAE,SAAS,EAAE,MAAM,EAAE,WAAW,GAAG,SAAS,CAkB5E"}
@@ -0,0 +1,44 @@
1
+ export const IMAGE_FORMATS = ['jpeg', 'png'];
2
+ /**
3
+ * 厂商的失败(HTTP 错误、拒绝生成、响应不成形、没拿到响应)。中心自己报的错是 `ProviderClientError`。
4
+ * 调用方只读 `retryable` 决定要不要再试,不解析消息文本。
5
+ */
6
+ export class ImageUpstreamError extends Error {
7
+ name = 'ImageUpstreamError';
8
+ /** 上游错误码(火山的 `InvalidParameter`、`OutputImageSensitiveContentDetected` ……),没有就是 null。 */
9
+ code;
10
+ retryable;
11
+ /** 被内容审核拦下(换提示词再试;原样重试没用)。 */
12
+ contentFiltered;
13
+ constructor(reason, opts = {}) {
14
+ super(reason);
15
+ this.code = opts.code ?? null;
16
+ this.retryable = opts.retryable ?? false;
17
+ this.contentFiltered = opts.contentFiltered ?? false;
18
+ }
19
+ }
20
+ /**
21
+ * 把想要的尺寸放进这家的限制:宽高比超了先按上限收窄短边;面积超了等比缩小、不够等比放大。取整后面积仍要在界内。
22
+ */
23
+ export function fitImageSize(size, traits) {
24
+ let { width: w, height: h } = size;
25
+ if (!(w > 0 && h > 0))
26
+ throw new RangeError('image size must be positive');
27
+ const ratio = Math.max(w, h) / Math.min(w, h);
28
+ if (ratio > traits.maxAspectRatio) {
29
+ if (w > h)
30
+ h = w / traits.maxAspectRatio;
31
+ else
32
+ w = h / traits.maxAspectRatio;
33
+ }
34
+ const area = w * h;
35
+ const scale = area > traits.maxPixels
36
+ ? Math.sqrt(traits.maxPixels / area)
37
+ : area < traits.minPixels
38
+ ? Math.sqrt(traits.minPixels / area)
39
+ : 1;
40
+ // 缩小向下取整、放大向上取整,取整后面积不越界。
41
+ const round = scale < 1 ? Math.floor : scale > 1 ? Math.ceil : Math.round;
42
+ return { width: round(w * scale), height: round(h * scale) };
43
+ }
44
+ //# sourceMappingURL=types.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"types.js","sourceRoot":"","sources":["../../src/image/types.ts"],"names":[],"mappings":"AAmBA,MAAM,CAAC,MAAM,aAAa,GAAG,CAAC,MAAM,EAAE,KAAK,CAAU,CAAC;AAsEtD;;;GAGG;AACH,MAAM,OAAO,kBAAmB,SAAQ,KAAK;IACzB,IAAI,GAAG,oBAAoB,CAAC;IAC9C,wFAAwF;IAC/E,IAAI,CAAgB;IACpB,SAAS,CAAU;IAC5B,8BAA8B;IACrB,eAAe,CAAU;IAElC,YACE,MAAc,EACd,OAA0E,EAAE;QAE5E,KAAK,CAAC,MAAM,CAAC,CAAC;QACd,IAAI,CAAC,IAAI,GAAG,IAAI,CAAC,IAAI,IAAI,IAAI,CAAC;QAC9B,IAAI,CAAC,SAAS,GAAG,IAAI,CAAC,SAAS,IAAI,KAAK,CAAC;QACzC,IAAI,CAAC,eAAe,GAAG,IAAI,CAAC,eAAe,IAAI,KAAK,CAAC;IACvD,CAAC;CACF;AAED;;GAEG;AACH,MAAM,UAAU,YAAY,CAAC,IAAe,EAAE,MAAmB;IAC/D,IAAI,EAAE,KAAK,EAAE,CAAC,EAAE,MAAM,EAAE,CAAC,EAAE,GAAG,IAAI,CAAC;IACnC,IAAI,CAAC,CAAC,CAAC,GAAG,CAAC,IAAI,CAAC,GAAG,CAAC,CAAC;QAAE,MAAM,IAAI,UAAU,CAAC,6BAA6B,CAAC,CAAC;IAC3E,MAAM,KAAK,GAAG,IAAI,CAAC,GAAG,CAAC,CAAC,EAAE,CAAC,CAAC,GAAG,IAAI,CAAC,GAAG,CAAC,CAAC,EAAE,CAAC,CAAC,CAAC;IAC9C,IAAI,KAAK,GAAG,MAAM,CAAC,cAAc,EAAE,CAAC;QAClC,IAAI,CAAC,GAAG,CAAC;YAAE,CAAC,GAAG,CAAC,GAAG,MAAM,CAAC,cAAc,CAAC;;YACpC,CAAC,GAAG,CAAC,GAAG,MAAM,CAAC,cAAc,CAAC;IACrC,CAAC;IACD,MAAM,IAAI,GAAG,CAAC,GAAG,CAAC,CAAC;IACnB,MAAM,KAAK,GACT,IAAI,GAAG,MAAM,CAAC,SAAS;QACrB,CAAC,CAAC,IAAI,CAAC,IAAI,CAAC,MAAM,CAAC,SAAS,GAAG,IAAI,CAAC;QACpC,CAAC,CAAC,IAAI,GAAG,MAAM,CAAC,SAAS;YACvB,CAAC,CAAC,IAAI,CAAC,IAAI,CAAC,MAAM,CAAC,SAAS,GAAG,IAAI,CAAC;YACpC,CAAC,CAAC,CAAC,CAAC;IACV,0BAA0B;IAC1B,MAAM,KAAK,GAAG,KAAK,GAAG,CAAC,CAAC,CAAC,CAAC,IAAI,CAAC,KAAK,CAAC,CAAC,CAAC,KAAK,GAAG,CAAC,CAAC,CAAC,CAAC,IAAI,CAAC,IAAI,CAAC,CAAC,CAAC,IAAI,CAAC,KAAK,CAAC;IAC1E,OAAO,EAAE,KAAK,EAAE,KAAK,CAAC,CAAC,GAAG,KAAK,CAAC,EAAE,MAAM,EAAE,KAAK,CAAC,CAAC,GAAG,KAAK,CAAC,EAAE,CAAC;AAC/D,CAAC"}
@@ -0,0 +1,8 @@
1
+ import { type GenerateImageInput, type GenerateImageOutcome, type ImageAdapter, type ImageConnection, type ImageTraits } from './types.js';
2
+ export declare class VolcengineImageAdapter implements ImageAdapter<'volcengine'> {
3
+ readonly kind: "volcengine";
4
+ readonly endpointProtocol: "openai-chat-completions";
5
+ traits(): ImageTraits;
6
+ generate(conn: ImageConnection, modelId: string, input: GenerateImageInput, signal: AbortSignal): Promise<GenerateImageOutcome>;
7
+ }
8
+ //# sourceMappingURL=volcengine.adapter.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"volcengine.adapter.d.ts","sourceRoot":"","sources":["../../src/image/volcengine.adapter.ts"],"names":[],"mappings":"AACA,OAAO,EACL,KAAK,kBAAkB,EACvB,KAAK,oBAAoB,EACzB,KAAK,YAAY,EACjB,KAAK,eAAe,EACpB,KAAK,WAAW,EAEjB,MAAM,YAAY,CAAC;AAkCpB,qBAAa,sBAAuB,YAAW,YAAY,CAAC,YAAY,CAAC;IACvE,QAAQ,CAAC,IAAI,EAAG,YAAY,CAAU;IACtC,QAAQ,CAAC,gBAAgB,EAAG,yBAAyB,CAAU;IAE/D,MAAM,IAAI,WAAW;IAIf,QAAQ,CACZ,IAAI,EAAE,eAAe,EACrB,OAAO,EAAE,MAAM,EACf,KAAK,EAAE,kBAAkB,EACzB,MAAM,EAAE,WAAW,GAClB,OAAO,CAAC,oBAAoB,CAAC;CA4DjC"}
@@ -0,0 +1,85 @@
1
+ import { clip, joinUrl, postJson } from './http.js';
2
+ import { ImageUpstreamError, } from './types.js';
3
+ /**
4
+ * 火山方舟(Seedream)生图:`POST {对话端点根}/images/generations`(`https://ark.cn-beijing.volces.com/api/v3`),
5
+ * OpenAI 形状。2026-11-13 经中心透传实测(Seedream 5.5 / 5.0 flash):
6
+ * - `size` 收 `WxH`,面积 921600~4624220 像素,比例宽松(16:1 也行),像素不用对齐;
7
+ * - 一次一张(`n` 被忽略,组图 5.5 不支持);参考图 `image` 收 data URI,最多 10 张;
8
+ * - 返回链接 24 小时失效 → 要 `b64_json`;`watermark: false` 去掉右下角「AI 生成」;
9
+ * - 失败是 `{ error: { code, message } }`(`InvalidParameter` / `MissingParameter` …)。
10
+ */
11
+ const TRAITS = {
12
+ minPixels: 921_600,
13
+ maxPixels: 4_624_220,
14
+ maxAspectRatio: 16,
15
+ maxReferenceImages: 10,
16
+ };
17
+ const LABEL = '火山方舟生图';
18
+ export class VolcengineImageAdapter {
19
+ kind = 'volcengine';
20
+ endpointProtocol = 'openai-chat-completions';
21
+ traits() {
22
+ return TRAITS;
23
+ }
24
+ async generate(conn, modelId, input, signal) {
25
+ const format = input.format ?? 'jpeg';
26
+ const refs = input.referenceImages ?? [];
27
+ const body = {
28
+ model: modelId,
29
+ prompt: input.prompt,
30
+ size: `${input.size.width}x${input.size.height}`,
31
+ response_format: 'b64_json',
32
+ output_format: format,
33
+ watermark: false,
34
+ };
35
+ if (refs.length > 0) {
36
+ const uris = refs.map(r => `data:${r.mimeType};base64,${Buffer.from(r.data).toString('base64')}`);
37
+ body.image = uris.length === 1 ? uris[0] : uris;
38
+ }
39
+ const res = await postJson(LABEL, joinUrl(conn.baseUrl, 'images/generations'), conn, body, signal);
40
+ let parsed;
41
+ try {
42
+ parsed = JSON.parse(res.text);
43
+ }
44
+ catch {
45
+ throw new ImageUpstreamError(`${LABEL}失败(HTTP ${res.status}):${clip(res.text)}`, { retryable: res.status === 429 || res.status >= 500 });
46
+ }
47
+ if (!res.ok || parsed.error) {
48
+ throw upstreamError(res.status, parsed.error);
49
+ }
50
+ const item = parsed.data?.[0];
51
+ if (item?.error)
52
+ throw upstreamError(res.status, item.error);
53
+ if (!item?.b64_json) {
54
+ throw new ImageUpstreamError(`${LABEL}没有返回图片:${clip(res.text)}`, {
55
+ retryable: true,
56
+ });
57
+ }
58
+ const [w, h] = (item.size ?? '').split('x').map(Number);
59
+ const outFormat = item.output_format === 'png' ? 'png' : format;
60
+ return {
61
+ image: {
62
+ data: new Uint8Array(Buffer.from(item.b64_json, 'base64')),
63
+ mimeType: outFormat === 'png' ? 'image/png' : 'image/jpeg',
64
+ width: w && Number.isFinite(w) ? w : input.size.width,
65
+ height: h && Number.isFinite(h) ? h : input.size.height,
66
+ },
67
+ usage: {
68
+ generatedImages: parsed.usage?.generated_images ?? 1,
69
+ inputImages: parsed.usage?.input_images ?? refs.length,
70
+ tokens: parsed.usage?.total_tokens ?? null,
71
+ },
72
+ };
73
+ }
74
+ }
75
+ function upstreamError(status, error) {
76
+ const code = error?.code;
77
+ const message = error?.message ?? '未知错误';
78
+ return new ImageUpstreamError(`${LABEL}失败(HTTP ${status}${code ? `,${code}` : ''}):${clip(message)}`, {
79
+ ...(code ? { code } : {}),
80
+ // 限流、服务端故障可重试;参数错、审核拦下重试没用。
81
+ retryable: status === 429 || status >= 500,
82
+ contentFiltered: !!code && /Sensitive|Moderation|RiskControl/i.test(code),
83
+ });
84
+ }
85
+ //# sourceMappingURL=volcengine.adapter.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"volcengine.adapter.js","sourceRoot":"","sources":["../../src/image/volcengine.adapter.ts"],"names":[],"mappings":"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"}
package/dist/index.d.ts CHANGED
@@ -1,9 +1,13 @@
1
1
  export { type CenterFetchOptions, createCenterFetch } from './center-fetch.js';
2
2
  export { type DirectModel, DirectModelResolver, type DirectVendor, } from './direct-resolver.js';
3
3
  export { ProtocolUnavailableError, ProviderClientError, type ProviderClientErrorCode, } from './errors.js';
4
+ export { createImageGenerator, type CreateImageGeneratorInput, fitImageSize, type GeneratedImage, type GenerateImageInput, type GenerateImageOutcome, IMAGE_ADAPTERS, IMAGE_FORMATS, IMAGE_KINDS, type ImageAdapter, type ImageConnection, type ImageFormat, type ImageGenerator, type ImageKind, type ImageSize, type ImageTraits, ImageUpstreamError, type ImageUsage, isImageKind, type ReferenceImage, } from './image/index.js';
5
+ export { classifyCode, createJustOne, type JustOne, JUSTONE_BASE_URL, JUSTONE_ENDPOINTS, JUSTONE_FAILURE_KINDS, JUSTONE_PRICE_FEN, JUSTONE_PRICING_EXPORTED_AT, JUSTONE_TIMEOUT_MS, type JustOneAttemptRecord, type JustOneCallOptions, type JustOneConnection, type JustOneEndpointKey, type JustOneEndpointSpec, justOneEndpointSpec, type JustOneFailureKind, type JustOneOptions, type JustOneParams, JustOneParamsError, type JustOneParamsOf, type JustOneParamSpec, justOnePriceFen, type JustOneResult, JustOneUpstreamError, type JustOneUpstreamFailureKind, type NormalizedParams, normalizeParams, } from './justone/index.js';
6
+ export { type AudioOutcome, type AudioRequest, BibiGptApiError, BibiGptNetworkError, buildPolishPrompt, type CacheKeyOpts, createMedia, type CreateMediaInput, directMediaConnection, type FileOutcome, type FileRequest, isMediaKind, localizeSummaryHeadings, MEDIA_ADAPTERS, MEDIA_CAPABILITIES, MEDIA_KINDS, type MediaAdapter, type MediaCapability, type MediaConnection, type MediaInput, type MediaKind, type MediaService, type MediaSettings, type MediaSettingsByKind, MediaUpstreamError, pageFromExpertName, type ParsedImage, parseParserPackage, type TokenUsage, type UploadLimitHint, type VideoLinkChapter, type VideoLinkOutcome, type VideoLinkRequest, type VideoLinkSubtitle, ZHIPU_AUDIO_MAX_BYTES, ZHIPU_FILE_TOOL_TYPES, ZHIPU_MIME_TO_EXT, type ZhipuFileToolType, } from './media/index.js';
4
7
  export { type ModelFileStore, type ModelHandle, type ModelRef, type ModelResolver, type ResolveOptions, type UploadedFile, } from './model-handle.js';
5
- export { type FetchForOptions, ProviderClient, type ProviderClientOptions, } from './provider-client.js';
8
+ export { type FetchForOptions, type ImageModelOptions, type JustOneClientOptions, type MediaOptions, ProviderClient, type ProviderClientOptions, type WebSearchOptions, } from './provider-client.js';
6
9
  export { toProviderClientError } from './to-error.js';
7
- export { type CatalogEndpoint, type CatalogModel, type CatalogResponse, type CatalogVendor, CENTER_ERROR_CODES, type CenterErrorCode, ENDPOINT_PROTOCOLS, type EndpointProtocol, LLM_CAPABILITIES, LLM_PROTOCOLS, type LlmCapability, type LlmProtocol, type ModelPricing, PC_HEADERS, PROXY_ROUTE_PREFIX, REASONING_EFFORTS, type ReasoningEffort, VENDOR_CATEGORIES, VENDOR_KINDS, type VendorCategory, type VendorKind, } from './types.js';
10
+ export { type CatalogEndpoint, type CatalogImageModel, type CatalogModel, type CatalogResponse, type CatalogVendor, CENTER_ERROR_CODES, type CenterErrorCode, ENDPOINT_PROTOCOLS, type EndpointProtocol, IMAGE_CAPABILITIES, type ImageCapability, type ImagePricing, LLM_CAPABILITIES, LLM_PROTOCOLS, type LlmCapability, type LlmProtocol, type ModelPricing, PC_HEADERS, PROXY_ROUTE_PREFIX, REASONING_EFFORTS, type ReasoningEffort, VENDOR_CATEGORIES, VENDOR_KINDS, type VendorCategory, type VendorKind, } from './types.js';
8
11
  export { type AdviceModelView, findVendorAdapter, getVendorAdapter, LlmVendorAdapter, type ModelAdvice, type ProviderOptions, type SamplingParams, VENDOR_ADAPTERS, type VendorFetch, } from './vendors/index.js';
12
+ export { createWebSearch, type CreateWebSearchInput, isWebSearchKind, KIMI_SEARCH_TIERS, type KimiSearchTier, WEB_SEARCH_ADAPTERS, WEB_SEARCH_FILTERS, WEB_SEARCH_KINDS, WEB_SEARCH_RECENCIES, type WebPageOutcome, type WebSearch, type WebSearchAdapter, type WebSearchConnection, type WebSearchFilter, type WebSearchInput, type WebSearchItem, type WebSearchKind, type WebSearchOutcome, type WebSearchRecency, type WebSearchSettings, type WebSearchSettingsByKind, type WebSearchTraits, WebSearchUpstreamError, ZHIPU_SEARCH_ENGINES, type ZhipuSearchEngine, } from './web-search/index.js';
9
13
  //# sourceMappingURL=index.d.ts.map
@@ -1 +1 @@
1
- {"version":3,"file":"index.d.ts","sourceRoot":"","sources":["../src/index.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,KAAK,kBAAkB,EAAE,iBAAiB,EAAE,MAAM,mBAAmB,CAAC;AAC/E,OAAO,EACL,KAAK,WAAW,EAChB,mBAAmB,EACnB,KAAK,YAAY,GAClB,MAAM,sBAAsB,CAAC;AAC9B,OAAO,EACL,wBAAwB,EACxB,mBAAmB,EACnB,KAAK,uBAAuB,GAC7B,MAAM,aAAa,CAAC;AACrB,OAAO,EACL,KAAK,cAAc,EACnB,KAAK,WAAW,EAChB,KAAK,QAAQ,EACb,KAAK,aAAa,EAClB,KAAK,cAAc,EACnB,KAAK,YAAY,GAClB,MAAM,mBAAmB,CAAC;AAC3B,OAAO,EACL,KAAK,eAAe,EACpB,cAAc,EACd,KAAK,qBAAqB,GAC3B,MAAM,sBAAsB,CAAC;AAC9B,OAAO,EAAE,qBAAqB,EAAE,MAAM,eAAe,CAAC;AACtD,OAAO,EACL,KAAK,eAAe,EACpB,KAAK,YAAY,EACjB,KAAK,eAAe,EACpB,KAAK,aAAa,EAClB,kBAAkB,EAClB,KAAK,eAAe,EACpB,kBAAkB,EAClB,KAAK,gBAAgB,EACrB,gBAAgB,EAChB,aAAa,EACb,KAAK,aAAa,EAClB,KAAK,WAAW,EAChB,KAAK,YAAY,EACjB,UAAU,EACV,kBAAkB,EAClB,iBAAiB,EACjB,KAAK,eAAe,EACpB,iBAAiB,EACjB,YAAY,EACZ,KAAK,cAAc,EACnB,KAAK,UAAU,GAChB,MAAM,YAAY,CAAC;AACpB,OAAO,EACL,KAAK,eAAe,EACpB,iBAAiB,EACjB,gBAAgB,EAChB,gBAAgB,EAChB,KAAK,WAAW,EAChB,KAAK,eAAe,EACpB,KAAK,cAAc,EACnB,eAAe,EACf,KAAK,WAAW,GACjB,MAAM,oBAAoB,CAAC"}
1
+ {"version":3,"file":"index.d.ts","sourceRoot":"","sources":["../src/index.ts"],"names":[],"mappings":"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"}
package/dist/index.js CHANGED
@@ -1,8 +1,12 @@
1
1
  export { createCenterFetch } from './center-fetch.js';
2
2
  export { DirectModelResolver, } from './direct-resolver.js';
3
3
  export { ProtocolUnavailableError, ProviderClientError, } from './errors.js';
4
+ export { createImageGenerator, fitImageSize, IMAGE_ADAPTERS, IMAGE_FORMATS, IMAGE_KINDS, ImageUpstreamError, isImageKind, } from './image/index.js';
5
+ export { classifyCode, createJustOne, JUSTONE_BASE_URL, JUSTONE_ENDPOINTS, JUSTONE_FAILURE_KINDS, JUSTONE_PRICE_FEN, JUSTONE_PRICING_EXPORTED_AT, JUSTONE_TIMEOUT_MS, justOneEndpointSpec, JustOneParamsError, justOnePriceFen, JustOneUpstreamError, normalizeParams, } from './justone/index.js';
6
+ export { BibiGptApiError, BibiGptNetworkError, buildPolishPrompt, createMedia, directMediaConnection, isMediaKind, localizeSummaryHeadings, MEDIA_ADAPTERS, MEDIA_CAPABILITIES, MEDIA_KINDS, MediaUpstreamError, pageFromExpertName, parseParserPackage, ZHIPU_AUDIO_MAX_BYTES, ZHIPU_FILE_TOOL_TYPES, ZHIPU_MIME_TO_EXT, } from './media/index.js';
4
7
  export { ProviderClient, } from './provider-client.js';
5
8
  export { toProviderClientError } from './to-error.js';
6
- export { CENTER_ERROR_CODES, ENDPOINT_PROTOCOLS, LLM_CAPABILITIES, LLM_PROTOCOLS, PC_HEADERS, PROXY_ROUTE_PREFIX, REASONING_EFFORTS, VENDOR_CATEGORIES, VENDOR_KINDS, } from './types.js';
9
+ export { CENTER_ERROR_CODES, ENDPOINT_PROTOCOLS, IMAGE_CAPABILITIES, LLM_CAPABILITIES, LLM_PROTOCOLS, PC_HEADERS, PROXY_ROUTE_PREFIX, REASONING_EFFORTS, VENDOR_CATEGORIES, VENDOR_KINDS, } from './types.js';
7
10
  export { findVendorAdapter, getVendorAdapter, LlmVendorAdapter, VENDOR_ADAPTERS, } from './vendors/index.js';
11
+ export { createWebSearch, isWebSearchKind, KIMI_SEARCH_TIERS, WEB_SEARCH_ADAPTERS, WEB_SEARCH_FILTERS, WEB_SEARCH_KINDS, WEB_SEARCH_RECENCIES, WebSearchUpstreamError, ZHIPU_SEARCH_ENGINES, } from './web-search/index.js';
8
12
  //# sourceMappingURL=index.js.map
package/dist/index.js.map CHANGED
@@ -1 +1 @@
1
- {"version":3,"file":"index.js","sourceRoot":"","sources":["../src/index.ts"],"names":[],"mappings":"AAAA,OAAO,EAA2B,iBAAiB,EAAE,MAAM,mBAAmB,CAAC;AAC/E,OAAO,EAEL,mBAAmB,GAEpB,MAAM,sBAAsB,CAAC;AAC9B,OAAO,EACL,wBAAwB,EACxB,mBAAmB,GAEpB,MAAM,aAAa,CAAC;AASrB,OAAO,EAEL,cAAc,GAEf,MAAM,sBAAsB,CAAC;AAC9B,OAAO,EAAE,qBAAqB,EAAE,MAAM,eAAe,CAAC;AACtD,OAAO,EAKL,kBAAkB,EAElB,kBAAkB,EAElB,gBAAgB,EAChB,aAAa,EAIb,UAAU,EACV,kBAAkB,EAClB,iBAAiB,EAEjB,iBAAiB,EACjB,YAAY,GAGb,MAAM,YAAY,CAAC;AACpB,OAAO,EAEL,iBAAiB,EACjB,gBAAgB,EAChB,gBAAgB,EAIhB,eAAe,GAEhB,MAAM,oBAAoB,CAAC"}
1
+ {"version":3,"file":"index.js","sourceRoot":"","sources":["../src/index.ts"],"names":[],"mappings":"AAAA,OAAO,EAA2B,iBAAiB,EAAE,MAAM,mBAAmB,CAAC;AAC/E,OAAO,EAEL,mBAAmB,GAEpB,MAAM,sBAAsB,CAAC;AAC9B,OAAO,EACL,wBAAwB,EACxB,mBAAmB,GAEpB,MAAM,aAAa,CAAC;AACrB,OAAO,EACL,oBAAoB,EAEpB,YAAY,EAIZ,cAAc,EACd,aAAa,EACb,WAAW,EAQX,kBAAkB,EAElB,WAAW,GAEZ,MAAM,kBAAkB,CAAC;AAC1B,OAAO,EACL,YAAY,EACZ,aAAa,EAEb,gBAAgB,EAChB,iBAAiB,EACjB,qBAAqB,EACrB,iBAAiB,EACjB,2BAA2B,EAC3B,kBAAkB,EAMlB,mBAAmB,EAInB,kBAAkB,EAGlB,eAAe,EAEf,oBAAoB,EAGpB,eAAe,GAChB,MAAM,oBAAoB,CAAC;AAC5B,OAAO,EAGL,eAAe,EACf,mBAAmB,EACnB,iBAAiB,EAEjB,WAAW,EAEX,qBAAqB,EAGrB,WAAW,EACX,uBAAuB,EACvB,cAAc,EACd,kBAAkB,EAClB,WAAW,EASX,kBAAkB,EAClB,kBAAkB,EAElB,kBAAkB,EAOlB,qBAAqB,EACrB,qBAAqB,EACrB,iBAAiB,GAElB,MAAM,kBAAkB,CAAC;AAS1B,OAAO,EAKL,cAAc,GAGf,MAAM,sBAAsB,CAAC;AAC9B,OAAO,EAAE,qBAAqB,EAAE,MAAM,eAAe,CAAC;AACtD,OAAO,EAML,kBAAkB,EAElB,kBAAkB,EAElB,kBAAkB,EAGlB,gBAAgB,EAChB,aAAa,EAIb,UAAU,EACV,kBAAkB,EAClB,iBAAiB,EAEjB,iBAAiB,EACjB,YAAY,GAGb,MAAM,YAAY,CAAC;AACpB,OAAO,EAEL,iBAAiB,EACjB,gBAAgB,EAChB,gBAAgB,EAIhB,eAAe,GAEhB,MAAM,oBAAoB,CAAC;AAC5B,OAAO,EACL,eAAe,EAEf,eAAe,EACf,iBAAiB,EAEjB,mBAAmB,EACnB,kBAAkB,EAClB,gBAAgB,EAChB,oBAAoB,EAcpB,sBAAsB,EACtB,oBAAoB,GAErB,MAAM,uBAAuB,CAAC"}
@@ -0,0 +1,101 @@
1
+ import type { VendorFetch } from '../vendors/index.js';
2
+ import type { JustOneEndpointSpec, JustOneParamsOf } from './endpoint-spec.js';
3
+ import { JUSTONE_ENDPOINTS } from './endpoints.generated.js';
4
+ import { type JustOneFailureKind } from './errors.js';
5
+ export declare const JUSTONE_BASE_URL = "https://api.justoneapi.com";
6
+ /** 官方建议 120 秒:服务端是现场去平台采集的,60 秒以下会有一部分请求等不到结果。 */
7
+ export declare const JUSTONE_TIMEOUT_MS = 120000;
8
+ export type JustOneEndpointKey = keyof typeof JUSTONE_ENDPOINTS;
9
+ /** 接口 `K` 的入参类型(必填 / 可选 / 枚举都按登记表收窄)。 */
10
+ export type JustOneParams<K extends JustOneEndpointKey> = JustOneParamsOf<(typeof JUSTONE_ENDPOINTS)[K]>;
11
+ /**
12
+ * 出站方式。中心模式(`ProviderClient.justOne`)不给 `token`:fetch 是中心模式 fetch,中心按厂商描述把 key 注入
13
+ * query 或表单字段 `token`。直连(本地开发、测试)给明文 token,用完即弃,不进记录、不进错误信息。
14
+ */
15
+ export interface JustOneConnection {
16
+ /** 缺省 `JUSTONE_BASE_URL`。 */
17
+ baseUrl?: string;
18
+ token?: string;
19
+ /** 缺省全局 fetch。 */
20
+ fetch?: VendorFetch;
21
+ }
22
+ /**
23
+ * 一次真正发出去的请求(重试各一条、调用方中途取消也一条——都可能扣费)。参数核对没过、根本没发出去的不报;
24
+ * 中心自己拦下的(没有可用 key、不许用这家……)也不报,那些请求没到 JustOne。
25
+ */
26
+ export interface JustOneAttemptRecord<C = unknown> {
27
+ endpoint: string;
28
+ /** 核对后线上的参数(不含 token)。 */
29
+ params: Record<string, string>;
30
+ attempt: number;
31
+ ok: boolean;
32
+ failureKind?: JustOneFailureKind;
33
+ code: number | null;
34
+ httpStatus: number | null;
35
+ requestId: string | null;
36
+ error?: string;
37
+ elapsedMs: number;
38
+ /** 原始返回体(已抹掉 token);没拿到返回体(连接失败、超时、取消)就没有。 */
39
+ response?: string;
40
+ /** 中心模式下实际用的那把 key(`x-pc-credential`);直连或没拿到响应是 null。 */
41
+ credential: string | null;
42
+ /** 定价表里的单价(分),null = 价格未知。 */
43
+ unitPriceFen: number | null;
44
+ /** 调用方给的 `JustOneCallOptions.context`,原样带回。 */
45
+ context: C | undefined;
46
+ }
47
+ export interface JustOneOptions<C = unknown> {
48
+ connection: JustOneConnection;
49
+ /**
50
+ * 每一次真正发出去的请求都调它(调用审计、花费由 APP 记)。放在这里而不是每次调用传,记录就不会被哪个调用方漏掉。
51
+ * 会被 await;**它不该抛**——走到这里时请求已经发出去了(成功的那次已经扣了费),让调用因记录失败而失败,
52
+ * 调用方会以为没调成、再调一次、再扣一次费。抛了的话客户端用 `console.error` 报出来,调用照常继续。
53
+ */
54
+ onAttempt?: (record: JustOneAttemptRecord<C>) => void | Promise<void>;
55
+ }
56
+ export interface JustOneCallOptions<C = unknown> {
57
+ /** 谁在调、在哪条对话里;原样进 `onAttempt` 的记录。 */
58
+ context?: C;
59
+ /** 调用方的取消信号(工具超时、用户停止)。取消时原样抛出它的 reason,不包成域错误。 */
60
+ signal?: AbortSignal;
61
+ /** 单次尝试的超时,缺省 `JUSTONE_TIMEOUT_MS`。 */
62
+ timeoutMs?: number;
63
+ /**
64
+ * 可重试的失败(`JustOneUpstreamError.retryable`)再试几次,缺省 1。
65
+ * 不确定失败的调用扣不扣费,要省钱的调用方传 0。
66
+ */
67
+ retries?: number;
68
+ }
69
+ export interface JustOneResult {
70
+ endpoint: string;
71
+ /** 信封里的 `data`。官方没有给出 schema,形状由调用方自己收窄。 */
72
+ data: unknown;
73
+ message: string | null;
74
+ requestId: string | null;
75
+ /** 服务端记录的采集时间(命中缓存的接口据此看数据新旧)。 */
76
+ recordTime: string | null;
77
+ /** 成功那一次的耗时。 */
78
+ elapsedMs: number;
79
+ /** 一共试了几次(含首次)。 */
80
+ attempts: number;
81
+ }
82
+ /**
83
+ * JustOne(`docs.justoneapi.com`)的调用客户端,连接已绑好。接口与参数来自生成的登记表 `JUSTONE_ENDPOINTS`:
84
+ *
85
+ * - 参数在发出前按登记表核对(`normalizeParams`),不对就抛 `JustOneParamsError`,不花钱;
86
+ * - token(直连时)按接口声明放进 query 或表单请求体;
87
+ * - 成败看信封里的 `code`(0 = 成功),**不看 HTTP 状态码**——失败时两者都会给,但只有业务码分得清是余额不足还是采集失败;
88
+ * - 可重试的失败(采集失败 301、服务端 500 / 503、连接失败、中心连不上 JustOne)默认再试一次,超时不重试;
89
+ * - 中心自己报的错(没有可用 key……)抛 `ProviderClientError`,不重试、不记录。
90
+ */
91
+ export interface JustOne<C = unknown> {
92
+ /** 类型化调用:业务代码用这个,接口名与参数在编译期就核对。 */
93
+ call<K extends JustOneEndpointKey>(endpoint: K, params: JustOneParams<K>, opts?: JustOneCallOptions<C>): Promise<JustOneResult>;
94
+ /** 接口名与参数在运行期才知道(例如模型选的)。核对规则同 `call`,错误在运行期以 `JustOneParamsError` 报出来。 */
95
+ callDynamic(endpoint: string, params: Readonly<Record<string, unknown>>, opts?: JustOneCallOptions<C>): Promise<JustOneResult>;
96
+ }
97
+ /** 绑好连接的 JustOne 客户端。中心模式用 `ProviderClient.justOne`;这里是直连与中心模式共用的底层。 */
98
+ export declare function createJustOne<C = unknown>(options: JustOneOptions<C>): JustOne<C>;
99
+ /** 按键查登记表;不在表里返回 undefined(`hasOwn` 不走原型链上的同名属性)。 */
100
+ export declare function justOneEndpointSpec(key: string): JustOneEndpointSpec | undefined;
101
+ //# sourceMappingURL=client.d.ts.map